import axios from "axios"
import Cookies from 'vue-cookies';
import { Toast } from 'vant';

let loadingInstance

const cancelSource = []
// console.log(store)
/**
 * codeMapping
 * @return Boolean true -> code = 0
 */
const codeMapping = (data) => {
  let result = false
  switch (data.code) {
    case 200:
      result = true
      break
    // 403 token过期
    case 402:
      result = false
      break
    // 404请求不存在
    case 404:
      result = false
      break
    case 401:
      result = false
      if (data.message) {
        Toast({
          type: 'error',
          message: data.message
        })
      }
      break
    default:
      if (data.message) {
        Toast({
          type: 'error',
          message: data.message
        })
      }else{
        Toast({
          type: 'error',
          message: '服务器错误'
        })
      }
      result = false
  }
  return result
}
/**
 * 跳转登录页面
 */

/**
 * error handler
 */
const errorHandler = (status, other) => {
  switch (status) {
    case 401:
      break
    // 403 token过期
    case 402:
      break
    // 404请求不存在
    case 404:
      break
    default:
      console.log(other)
  }
}


instance.interceptors.request.use(
  config => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
     // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
     const token = Cookies.get('token')
     if(token) {
       config.headers.token = "Bearer " + token
     }
     config.headers.token = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvYXBpLmJhaWJpZy5jb21cL2ludGVyZmFjZS5waHBcL2xvZ2luIiwiaWF0IjoxNTk0Mjg4Mjc2LCJleHAiOjE1OTY4ODAyNzYsIm5iZiI6MTU5NDI4ODI3NiwianRpIjoiUWpDNnRTWFpsbUIyVEY1OCIsInN1YiI6MTAsInBydiI6ImY2YjcxNTQ5ZGI4YzJjNDJiNzU4MjdhYTQ0ZjAyYjdlZTUyOWQyNGQifQ.Nq2Nk78QN556aqiIz9OxmmqcLePmUdif5Q1skJbepn4"
     config.url = `${config.url}`
     return config
   },
   error => Promise.error(error)
 )
// 响应拦截器
instance.interceptors.response.use(
  // 请求成功
  res => {
    loadingInstance && loadingInstance.close()
    // debugger
    let _result
    const { data } = res
    _result = codeMapping(data)
    return _result ? Promise.resolve(data) : Promise.resolve(data)
  },
  // 请求失败
  error => {
    loadingInstance && loadingInstance.close()
    const { response } = error
    if (response) {
      // 请求已发出，但是不在2xx的范围
      errorHandler(response.status, response.data.message)
      return Promise.reject(response)
    } else {
      cancelSource.push(error)
      // 处理断网的情况
      // eg:请求超时或断网时，更新state的network状态
      // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
      // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
      // store.commit('changeNetwork', false)
    }
  }
)

export const get = (url, params, config = {}) => {
  return instance.get(url, { params })
}
export const post = (url, params, config = {}) => {
  return instance.post(url, params)
}
